package educar.models;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import educar.db.JPA;

public class Equipo{
	private Teacher docente;
	private Materia materia;
	private String nro_equipo;
	private static JPA jpa= new JPA();
	

	/**
	 * Permite crear un objeto equipo
	 * @param nro_equipo auto incremental de la base de datos
	 * @param docente Teacher que forma el equipo
	 * @param materia Materia a la que pertenece el docnete
	 */
	public Equipo (String nro_equipo,Teacher docente,Materia materia){
		setDocente(docente);
		setMateria(materia);
		setNro_equipo(nro_equipo);
	}
	
	/**
	 * Obtiene el docente del equipo
	 * @return Teacher
	 */
	public Teacher getDocente() {
		return docente;
	}

	/**
	 * Establece el docente del equipo
	 * @param docente Teacher
	 */
	public void setDocente(Teacher docente) {
		this.docente = docente;
	}
	
	/**
	 * Obtiene la materia del equipo
	 * @return Materia
	 */
	public Materia getMateria() {
		return materia;
	}
	
	/**
	 * Establece la materia del equipo
	 * @param materia Materia
	 */
	public void setMateria(Materia materia) {
		this.materia = materia;
	}

	/**
	 * Obtiene el nro del equipo segun
	 * la base de datos
	 * @return String con el numero
	 */
	public String getNro_equipo() {
		return nro_equipo;
	}

	/**
	 * Guarda el numero de equipo que
	 * asigna la base de datos
	 * @param nro_equipo String
	 */
	public void setNro_equipo(String nro_equipo) {
		this.nro_equipo = nro_equipo;
	}

	
	/**
	 * Permite guardar en la base de datos
	 * @return true o false dependiendo exito o fracaso
	 */
	public boolean save() {
		try {
			Equipo.getEquipoByDniMateria(this.getDocente().getDni(), this.getMateria().getCodigo());
			return false;
		} catch (equipoNotFound e1) {
			String[] columns = { "dni","cod_materia" };
			PreparedStatement stm = jpa.newRecord("equipo", columns);
			try {
				stm.setString(1, this.getDocente().getDni());
				stm.setString(2, this.getMateria().getCodigo());
			} catch (SQLException e) {
				e.printStackTrace();
				return false;
			}
			jpa.create(stm);
			return true;
		}
	}

	
	/**
	 * permite borrar un equipo de la base de datos
	 */
	public void destroy() {
		try {
			jpa.destroy("equipo", "nro_equipo", this.getNro_equipo());
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * permite actualizar un equipo en la base de datos
	 * @return booleano segun exito o fracaso
	 */
	public boolean update() {
		try {
			String[] datos = {this.getDocente().getDni(),this.getMateria().getCodigo()};			
			String[] columns = { "dni","cod_materia" };
			jpa.update("equipo", columns, datos, "nro_equipo", this.getNro_equipo());
			return true;
		} catch(Exception ex) {
			return false;
		}
	}
	
	
	/**
	 * obtiene un elemento equipo por el dni y el codigo de la materia 
	 * @param dni del docente
	 * @param cod_materia de la materia
	 * @return Objeto Equipo
	 * @throws equipoNotFound por si el equipo no existe
	 */
	public static Equipo getEquipoByDniMateria(String dni,String cod_materia) throws equipoNotFound {
		ResultSet rs = null;
		Equipo t = null;
		String[] columnas = {"dni","cod_materia"};
		String[] datos = {dni,cod_materia};
		rs = jpa.getByField("equipo",columnas, datos);
		try {
			if (rs.next()) {
				try {
					t = new Equipo(rs.getString(1),Teacher.getTeacherByDni(rs.getString(2)), Materia.getMateriaByCodigo(rs.getString(3)));
				} catch (NumberFormatException e) {
					e.printStackTrace();
				} catch (teacherNotFound e) {
					e.printStackTrace();
				} catch (materiaNotFound e) {
					e.printStackTrace();
				}
			} 
			else {
				throw new equipoNotFound();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return t;
	}
	
	
	/**
	 * Obtiene la tabla equipo desde la base de datos
	 * @return Matriz de objetos de la tabla equipo
	 */
	public static Object[][] getEquipoTable(){
		Object[][] equipoTable = jpa.ResultSetToArray(jpa.showAll("equipo"));
		for (int i=0;i<equipoTable.length;i++) {
			try {
				equipoTable[i][1] = Teacher.getTeacherByDni(String.valueOf(equipoTable[i][1]));
			} catch (teacherNotFound e) {
				e.printStackTrace();
			}
			try {
				equipoTable[i][2] = Materia.getMateriaByCodigo(String.valueOf(equipoTable[i][2]));
			} catch (materiaNotFound e) {
				e.printStackTrace();
			}
		}
	
		
		return equipoTable;
	}
}